#include "head.h"
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>

// 显示菜单并获取用户选择
int display_menu(const wchar_t *title, const wchar_t *choices[], int n_choices) {
    setlocale(LC_ALL, "");
    initscr();
    start_color(); // 启用颜色功能
    clear();
    noecho();
    cbreak();
    curs_set(0);

    // 初始化颜色对
    init_pair(1, COLOR_CYAN, COLOR_BLACK);    // 标题颜色
    init_pair(2, COLOR_WHITE, COLOR_BLUE);    // 菜单项颜色
    init_pair(3, COLOR_BLACK, COLOR_YELLOW);  // 高亮菜单项颜色
    init_pair(4, COLOR_MAGENTA, COLOR_BLACK); // 边框颜色
    init_pair(5, COLOR_GREEN, COLOR_BLACK);   // 点缀颜色
    init_pair(6, COLOR_MAGENTA, COLOR_YELLOW); // 二次元装饰颜色

    int highlight = 1;
    int choice = 0;
    int c;

    WINDOW *menu_win = newwin(LINES, COLS, 0, 0);
    keypad(menu_win, TRUE);
    
    update_menu(menu_win, title, highlight, choices, n_choices); // 显示菜单

    while(1) {
        c = wgetch(menu_win);
        switch(c) {
            case KEY_UP:  
                highlight = (highlight == 1) ? n_choices : highlight - 1;
                break;
            case KEY_DOWN: 
                highlight = (highlight == n_choices) ? 1 : highlight + 1;
                break;
            case 10:  // Enter 键
                choice = highlight;
                break;
            default:
                break;
        }
        update_menu(menu_win, title, highlight, choices, n_choices);
        if(choice != 0)  // 如果按了回车键，则退出循环
            break;
    }

    setlocale(LC_ALL, "C");
    endwin();

    return choice; // 返回用户选择的选项值
}

// 更新并显示菜单
void update_menu(WINDOW *menu_win, const wchar_t *title, int highlight, const wchar_t *choices[], int n_choices) {
    int x, y;

    wbkgd(menu_win, COLOR_PAIR(4)); // 设置窗口背景为边框颜色

    int title_y = 2;  
    int title_x = (COLS - wcslen(title) - (wcslen(title) / 4)) / 2;

    // 绘制边框和点缀
    attron(COLOR_PAIR(5) | A_BOLD); // 点缀颜色
    for (size_t i = 0; i < COLS; i++) {
        mvwprintw(menu_win, 0, i, "-");  // 顶部边框
        mvwprintw(menu_win, LINES-1, i, "-");  // 底部边框
    }
    for (size_t i = 0; i < LINES; i++) {
        mvwprintw(menu_win, i, 0, "|");  // 左边框
        mvwprintw(menu_win, i, COLS-1, "|");  // 右边框
    }
    attroff(COLOR_PAIR(5) | A_BOLD);

    // 绘制标题及其修饰
    attron(COLOR_PAIR(1) | A_BOLD); // 设置标题颜色和加粗
    for (size_t i = 0; i < COLS; i++) {
        mvwprintw(menu_win, title_y - 1, i, "*");
        mvwprintw(menu_win, title_y + 1, i, "*");
    }
    mvwprintw(menu_win, title_y, title_x, " %ls ", title);
    attroff(COLOR_PAIR(1) | A_BOLD);

    // 添加角落装饰
    mvwprintw(menu_win, 0, 0, "+");
    mvwprintw(menu_win, 0, COLS-1, "+");
    mvwprintw(menu_win, LINES-1, 0, "+");
    mvwprintw(menu_win, LINES-1, COLS-1, "+");

    // 添加二次元装饰
    attron(COLOR_PAIR(6) | A_BOLD);
    mvwprintw(menu_win, LINES/2-10, COLS/2-15, " ~~~ \\(^_^)/ ~~~ ");
    mvwprintw(menu_win, LINES/2+10, COLS/2-15, " ~~~ (^o^) ~~~ ");
    attroff(COLOR_PAIR(6) | A_BOLD);

    // 计算菜单项的起始行位置，确保其在标题下方居中显示
    int start_y = (LINES - n_choices) / 2;

    // 绘制菜单项
    box(menu_win, 0, 0);  
    for(int i = 0; i < n_choices; ++i) {
        y = start_y + i;  
        x = (COLS - wcslen(choices[i])) / 2;

        if(highlight == i + 1) {
            wattron(menu_win, COLOR_PAIR(3) | A_BOLD);  // 仅高亮并加粗当前选项
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
            wattroff(menu_win, COLOR_PAIR(3) | A_BOLD);
        } else {
            wattron(menu_win, COLOR_PAIR(2));  // 普通菜单项的颜色
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
            wattroff(menu_win, COLOR_PAIR(2));
        }
    }

    wrefresh(menu_win);
}




// 全局标志位
int ACCIDENT = 0;
int LOGO = 0;
int FLY = 0;
int C51 = 0;
int INTR = 0;

// 在指定位置绘制字符串，支持左移
int my_mvaddstr(int y, int x, char *str) {
    for (; x < 0; ++x, ++str)
        if (*str == '\0')
            return ERR;

    for (; *str != '\0'; ++str, ++x)
        if (mvaddch(y, x, *str) == ERR)
            return ERR;

    return OK;
}

// 处理命令行参数，设置标志位
void option(char *str) {
    extern int ACCIDENT, FLY, LOGO, C51, INTR;

    while (*str != '\0') {
        switch (*str++) {
            case 'a': ACCIDENT = 1;
                      break;
            case 'F': FLY = 1;
                      break;
            case 'l': LOGO = 1;
                      break;
            case 'c': C51 = 1;
                      break;
            case 'e': INTR = 1;
                      break;
            default:
                      break;
        }
    }
}

static char *plane_pattern[] = {
    LINE_1,
    LINE_2,
    LINE_3,
    LINE_4,
    LINE_5,
    LINE_6,
    LINE_7,
    LINE_8,
    LINE_9,
    LINE_10,
    LINE_11,
    LINE_12,
    LINE_13,
    LINE_14,
};


// 在指定位置绘制飞机
int add_plane(int x) {
    int y = LINES / 2 - sizeof(plane_pattern) / sizeof(plane_pattern[0]) / 2;

    for (int i = 0; i < sizeof(plane_pattern) / sizeof(plane_pattern[0]); ++i) {
        // 清除之前位置的飞机字符
        for (int j = 0; j < COLS; j++) {
            mvaddch(y + i, j, ' ');
        }
        // 绘制飞机并使飞机从左往右飞
        my_mvaddstr(y + i, x, plane_pattern[i]);
    }

    return OK;
}

// 添加飞机烟雾拖尾效果
void add_smoke_trail(int x, int trail_length) {
    int y = LINES / 2 - sizeof(plane_pattern) / sizeof(plane_pattern[0]) / 2;

    for (int i = 0; i < sizeof(plane_pattern) / sizeof(plane_pattern[0]); ++i) {
        for (int j = 1; j <= trail_length; ++j) {
            int smoke_x = x - j;
            int smoke_y = y + i;

            for (int k = -j / 2; k <= j / 2; ++k) {
                if (smoke_x + k >= 0 && smoke_x + k < COLS) {
                    mvaddch(smoke_y, smoke_x + k, SMOKE_CHARS[(j + k) % NUM_SMOKE_CHARS]);
                }
            }
        }
    }
}

void Flying_plane()
{
    //  // 处理命令行参数
    // for (int i = 1; i < argc; ++i) {
    //     if (*argv[i] == '-') {
    //         option(argv[i] + 1);
    //     }
    // }

    // 初始化屏幕
    initscr();

    // 忽略 Ctrl+C 信号
    // if (INTR == 0) {
    //     signal(SIGINT, SIG_IGN);
    // }

    // 设置一些屏幕属性
    noecho();
    curs_set(0);
    nodelay(stdscr, TRUE);
    leaveok(stdscr, TRUE);
    scrollok(stdscr, FALSE);

    int plane_width = 50; // 假设飞机宽度为50个字符
    int x = -plane_width; // 初始位置在屏幕左侧之外
    int smoke_trail_length = 5; // 烟雾拖尾长度

    // 移动飞机并添加烟雾效果
    while (x < COLS) {
        if (LOGO == 1) {
            // 添加 logo 的相关代码
        } else {
            if (add_plane(x) == ERR) break;
            add_smoke_trail(x, smoke_trail_length);
        }

        int ch = getch();
        if (ch != ERR) break; // 如果按下按键，则退出循环
        refresh();
        usleep(40000); // 控制飞机移动速度
        x += 3; // 每次让飞机向右移动3个字符
    }

    // 恢复光标位置并结束
    mvcur(0, COLS - 1, LINES - 1, 0);
    endwin();
}

